{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a704be80",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:05:59.730379Z",
     "start_time": "2023-04-27T15:05:57.689053Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "import torch.nn.functional as F\n",
    "import transformers\n",
    "from transformers import AutoTokenizer, AutoConfig, AutoModel\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib as mpl\n",
    "from IPython.display import Image\n",
    "# default: 100\n",
    "mpl.rcParams['figure.dpi'] = 150"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4872f14",
   "metadata": {},
   "source": [
    "## summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "80054cbe",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:06:01.206407Z",
     "start_time": "2023-04-27T15:06:01.197231Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image('../imgs/The-Transformer-model-architecture.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "865e15f7",
   "metadata": {},
   "source": [
    "- decoder 与 encoder 相比，有两个特殊的 attention sublayers\n",
    "    - masked multi-head (**self**) attention\n",
    "    - encoder-decoder (**cross**) attention\n",
    "        - (k, v) from encoder （memory, last encoder layer）\n",
    "        - q：decoder input\n",
    "    - 两者权值不共享"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f1ab7a1",
   "metadata": {},
   "source": [
    "##  mask"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ca76068d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:08:35.913705Z",
     "start_time": "2023-04-27T15:08:32.718696Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of the model checkpoint at bert-base-uncased were not used when initializing BertModel: ['cls.predictions.decoder.weight', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.LayerNorm.weight', 'cls.seq_relationship.weight', 'cls.predictions.bias', 'cls.predictions.transform.LayerNorm.bias', 'cls.seq_relationship.bias', 'cls.predictions.transform.dense.bias']\n",
      "- This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
      "- This IS NOT expected if you are initializing BertModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n"
     ]
    }
   ],
   "source": [
    "model_ckpt = 'bert-base-uncased'\n",
    "model = AutoModel.from_pretrained(model_ckpt)\n",
    "# print(model)\n",
    "# print(model.embeddings)\n",
    "# print(model.encoder)\n",
    "# 只显示了 layer 的定义，层与层之间的拓扑/连接关系，在 module 的 forward 中定义；\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_ckpt)\n",
    "config = AutoConfig.from_pretrained(model_ckpt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "36b6e712",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:08:39.413362Z",
     "start_time": "2023-04-27T15:08:39.166909Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 5, 768])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# input\n",
    "# config.vocab_size: 30522, \n",
    "# config.hidden_size: 768=64*12\n",
    "# lookup-table, learnable\n",
    "token_embedding = nn.Embedding(config.vocab_size, config.hidden_size)\n",
    "# token_embedding\n",
    "sample_text = 'time flies like an arrow'\n",
    "model_inputs = tokenizer(sample_text, return_tensors='pt', add_special_tokens=False)\n",
    "# forward of embedding module\n",
    "input_embeddings = token_embedding(model_inputs['input_ids'])\n",
    "# batch_size, seq_len, hidden_size\n",
    "input_embeddings.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a57e253a",
   "metadata": {},
   "source": [
    "### 下三角矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a7d5e034",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:09:53.042189Z",
     "start_time": "2023-04-27T15:09:53.032493Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[29.3773,  1.3381, -0.1734, -1.9150, -0.0372],\n",
       "         [ 1.3381, 29.0873, -0.4198, -0.8163,  0.1404],\n",
       "         [-0.1734, -0.4198, 29.4697, -1.8265,  0.3513],\n",
       "         [-1.9150, -0.8163, -1.8265, 25.6442, -0.4334],\n",
       "         [-0.0372,  0.1404,  0.3513, -0.4334, 27.0381]]],\n",
       "       grad_fn=<DivBackward0>)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import math\n",
    "q = k = v = input_embeddings\n",
    "# (1, 5, 768) * (1, 768, 5) => (1, 5, 5)\n",
    "scores = torch.bmm(q, k.transpose(1, 2))/math.sqrt(k.size(-1))\n",
    "scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d69d064f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:10:22.947219Z",
     "start_time": "2023-04-27T15:10:22.936366Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 5, 5])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([[[1., 0., 0., 0., 0.],\n",
       "         [1., 1., 0., 0., 0.],\n",
       "         [1., 1., 1., 0., 0.],\n",
       "         [1., 1., 1., 1., 0.],\n",
       "         [1., 1., 1., 1., 1.]]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "seq_len = model_inputs['input_ids'].size(-1)\n",
    "# triangular lower（上三角的话，torch.triu，upper triangular）\n",
    "mask = torch.tril(torch.ones(seq_len, seq_len)).unsqueeze(0)\n",
    "print(mask.shape)\n",
    "mask"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f4661f6d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:11:05.063730Z",
     "start_time": "2023-04-27T15:11:05.054830Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[29.3773,    -inf,    -inf,    -inf,    -inf],\n",
       "         [ 1.3381, 29.0873,    -inf,    -inf,    -inf],\n",
       "         [-0.1734, -0.4198, 29.4697,    -inf,    -inf],\n",
       "         [-1.9150, -0.8163, -1.8265, 25.6442,    -inf],\n",
       "         [-0.0372,  0.1404,  0.3513, -0.4334, 27.0381]]],\n",
       "       grad_fn=<MaskedFillBackward0>)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores.masked_fill(mask == 0, -float('inf'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b7f455b2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:11:28.169372Z",
     "start_time": "2023-04-27T15:11:28.161302Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[29.3773,    -inf,    -inf,    -inf,    -inf],\n",
       "         [ 1.3381, 29.0873,    -inf,    -inf,    -inf],\n",
       "         [-0.1734, -0.4198, 29.4697,    -inf,    -inf],\n",
       "         [-1.9150, -0.8163, -1.8265, 25.6442,    -inf],\n",
       "         [-0.0372,  0.1404,  0.3513, -0.4334, 27.0381]]],\n",
       "       grad_fn=<MaskedFillBackward0>)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# in place\n",
    "scores.masked_fill_(mask == 0, -float('inf'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "8ab5d65d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:11:33.654143Z",
     "start_time": "2023-04-27T15:11:33.646268Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[29.3773,    -inf,    -inf,    -inf,    -inf],\n",
       "         [ 1.3381, 29.0873,    -inf,    -inf,    -inf],\n",
       "         [-0.1734, -0.4198, 29.4697,    -inf,    -inf],\n",
       "         [-1.9150, -0.8163, -1.8265, 25.6442,    -inf],\n",
       "         [-0.0372,  0.1404,  0.3513, -0.4334, 27.0381]]],\n",
       "       grad_fn=<MaskedFillBackward0>)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e89cdeef",
   "metadata": {},
   "source": [
    "$$\n",
    "\\exp(-\\infty) = 0\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "fe42e085",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:11:42.368005Z",
     "start_time": "2023-04-27T15:11:42.360039Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.exp(torch.tensor(-float('inf')))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a395a72f",
   "metadata": {},
   "source": [
    "## (masked) self attention"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "ac8e1c2a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:12:49.397357Z",
     "start_time": "2023-04-27T15:12:49.389674Z"
    }
   },
   "outputs": [],
   "source": [
    "def scaled_dot_product_attn(q, k, v, mask=None):\n",
    "    # q, k, v: (b, s, h/a) (a: number heads, 12, 768/12=64)\n",
    "    dim_k = k.size(-1)\n",
    "    # b, s, s\n",
    "    scores = torch.bmm(q, k.transpose(1, 2))/math.sqrt(dim_k)\n",
    "    if mask is not None:\n",
    "        scores.masked_fill_(mask == 0, -float('inf'))\n",
    "    # 上对角值为 0 \n",
    "    attn_weights = F.softmax(scores, dim=-1)\n",
    "    print(attn_weights)\n",
    "    return torch.bmm(attn_weights, v)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "1bfc1136",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:13:04.673826Z",
     "start_time": "2023-04-27T15:13:04.661846Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[[1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],\n",
      "         [8.8860e-13, 1.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],\n",
      "         [1.3371e-13, 1.0452e-13, 1.0000e+00, 0.0000e+00, 0.0000e+00],\n",
      "         [1.0745e-12, 3.2234e-12, 1.1738e-12, 1.0000e+00, 0.0000e+00],\n",
      "         [1.7432e-12, 2.0818e-12, 2.5706e-12, 1.1729e-12, 1.0000e+00]]],\n",
      "       grad_fn=<SoftmaxBackward0>)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([[[-0.4962, -0.8516, -1.3029,  ...,  1.6259, -0.9577, -1.2302],\n",
       "         [ 0.5159,  2.1284,  0.5108,  ...,  0.9423, -1.8939, -0.1485],\n",
       "         [ 1.3011, -1.3183, -0.5242,  ..., -1.0556, -1.9022, -1.6921],\n",
       "         [-0.3695, -0.8165, -1.8978,  ...,  0.0317,  1.2554, -0.1684],\n",
       "         [-0.0618,  0.3547, -0.0952,  ..., -1.1292, -0.3383,  0.4696]]],\n",
       "       grad_fn=<BmmBackward0>)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scaled_dot_product_attn(q, k, v, mask)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c8931ce",
   "metadata": {},
   "source": [
    "## 源码分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "0df88e33",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:16:28.925973Z",
     "start_time": "2023-04-27T15:16:28.848313Z"
    }
   },
   "outputs": [],
   "source": [
    "decoder_layer = nn.TransformerDecoderLayer(d_model=512, nhead=8)\n",
    "# s1, b, h1\n",
    "# from encoder output (last encoder layer output)\n",
    "memory = torch.rand(10, 32, 512)\n",
    "# s2, b, h2, from decoder input\n",
    "tgt = torch.rand(20, 32, 512)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "786f8c9a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:16:34.826047Z",
     "start_time": "2023-04-27T15:16:34.818669Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n",
      "True\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "print(decoder_layer.dropout.training)\n",
    "print(decoder_layer.dropout1.training)\n",
    "print(decoder_layer.dropout2.training)\n",
    "print(decoder_layer.dropout3.training)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f3378698",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:17:06.769141Z",
     "start_time": "2023-04-27T15:17:06.758763Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "TransformerDecoderLayer(\n",
       "  (self_attn): MultiheadAttention(\n",
       "    (out_proj): NonDynamicallyQuantizableLinear(in_features=512, out_features=512, bias=True)\n",
       "  )\n",
       "  (multihead_attn): MultiheadAttention(\n",
       "    (out_proj): NonDynamicallyQuantizableLinear(in_features=512, out_features=512, bias=True)\n",
       "  )\n",
       "  (linear1): Linear(in_features=512, out_features=2048, bias=True)\n",
       "  (dropout): Dropout(p=0.1, inplace=False)\n",
       "  (linear2): Linear(in_features=2048, out_features=512, bias=True)\n",
       "  (norm1): LayerNorm((512,), eps=1e-05, elementwise_affine=True)\n",
       "  (norm2): LayerNorm((512,), eps=1e-05, elementwise_affine=True)\n",
       "  (norm3): LayerNorm((512,), eps=1e-05, elementwise_affine=True)\n",
       "  (dropout1): Dropout(p=0.1, inplace=False)\n",
       "  (dropout2): Dropout(p=0.1, inplace=False)\n",
       "  (dropout3): Dropout(p=0.1, inplace=False)\n",
       ")"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# bn, dropout\n",
    "decoder_layer.eval()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "5fa98de6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:17:36.512180Z",
     "start_time": "2023-04-27T15:17:36.506340Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False\n",
      "False\n",
      "False\n",
      "False\n"
     ]
    }
   ],
   "source": [
    "print(decoder_layer.dropout.training)\n",
    "print(decoder_layer.dropout1.training)\n",
    "print(decoder_layer.dropout2.training)\n",
    "print(decoder_layer.dropout3.training)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "2357792c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:18:17.938984Z",
     "start_time": "2023-04-27T15:18:17.905782Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([20, 32, 512])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([[[-1.8008,  0.0955,  0.4715,  ..., -0.8585,  1.3289, -0.8393],\n",
       "         [-0.9372,  0.3635,  0.5085,  ..., -1.6473,  0.3759,  1.4563],\n",
       "         [-0.6191,  0.0879,  0.6518,  ..., -0.2662, -0.5986, -0.1011],\n",
       "         ...,\n",
       "         [-0.7244,  0.2882, -0.6515,  ..., -0.3170,  0.3018,  1.0053],\n",
       "         [-0.7184,  0.9173,  0.2708,  ..., -1.1280,  0.7655,  0.5195],\n",
       "         [-0.1449,  1.3841, -1.6920,  ..., -1.5435,  0.8277,  1.8407]],\n",
       "\n",
       "        [[ 0.0512,  0.6386, -0.0195,  ..., -0.2089,  2.6903,  1.4809],\n",
       "         [ 0.4438, -0.0604, -0.5986,  ...,  0.0636,  1.2456, -0.1515],\n",
       "         [-0.2601, -1.1402, -1.0853,  ...,  0.1306,  1.2988,  1.3415],\n",
       "         ...,\n",
       "         [ 0.7709,  0.1656, -1.2257,  ..., -0.8002, -0.0339,  2.0337],\n",
       "         [-1.1068, -0.9135,  0.7009,  ...,  0.4307,  0.7334,  1.4293],\n",
       "         [-1.7199,  1.5007,  0.3761,  ..., -1.8088,  1.7812,  0.2291]],\n",
       "\n",
       "        [[-0.1397, -0.4083, -0.9826,  ..., -1.3970,  1.2486,  0.2054],\n",
       "         [-1.0634, -0.6352, -0.2336,  ..., -1.5486, -0.3188,  1.2034],\n",
       "         [-1.6039,  0.3520,  0.1545,  ..., -1.6741,  0.4996,  1.4587],\n",
       "         ...,\n",
       "         [-2.1638, -0.6909, -0.1016,  ..., -0.5763,  2.3496, -0.5038],\n",
       "         [-0.1091, -0.6120,  0.7259,  ..., -0.0967,  1.3078,  1.2574],\n",
       "         [-0.8147,  1.6513,  0.1907,  ..., -1.5854,  0.0800, -0.5341]],\n",
       "\n",
       "        ...,\n",
       "\n",
       "        [[-0.1486,  0.3316, -1.2555,  ..., -1.3356,  0.7492,  0.0624],\n",
       "         [-0.4191,  0.0374, -0.7435,  ..., -0.5843,  1.3116,  0.3629],\n",
       "         [ 0.6715, -0.4680, -0.2566,  ..., -1.6594,  1.5688,  1.1539],\n",
       "         ...,\n",
       "         [ 0.0748,  1.6114,  0.2869,  ...,  0.1299,  1.3297, -0.1339],\n",
       "         [-1.1404,  0.7748, -1.0458,  ..., -0.7664,  1.7932,  1.3885],\n",
       "         [-1.5743,  0.6126, -0.4044,  ..., -1.3283,  2.3873,  1.2038]],\n",
       "\n",
       "        [[-0.3198,  1.0928, -0.7945,  ..., -1.5612,  1.3291,  1.6834],\n",
       "         [-1.2999, -0.3100, -1.6255,  ..., -1.5263,  2.0699,  0.7236],\n",
       "         [ 0.1870, -0.7859, -1.5370,  ...,  0.2425,  0.1045,  1.3136],\n",
       "         ...,\n",
       "         [-0.0416,  1.6009, -0.3964,  ..., -1.3005,  1.5739,  0.5326],\n",
       "         [-0.8052, -0.4260, -0.1789,  ..., -0.4825,  0.6915,  0.8723],\n",
       "         [-0.2016,  1.3798, -1.6962,  ...,  0.1432,  1.0728, -0.7677]],\n",
       "\n",
       "        [[-1.7552,  1.0003, -0.3777,  ...,  0.3128,  0.2593,  1.5819],\n",
       "         [-0.5774,  0.0282,  0.1389,  ..., -1.8704,  0.3523, -0.1210],\n",
       "         [-0.4373, -0.9840, -0.1368,  ...,  0.2160,  1.8261,  0.9377],\n",
       "         ...,\n",
       "         [ 0.6790,  1.2266, -1.8964,  ..., -1.6937,  1.2025,  1.0664],\n",
       "         [-0.4589,  1.5109, -0.8836,  ...,  0.5577,  0.9277,  0.3527],\n",
       "         [ 0.3819,  1.5442,  0.3358,  ..., -0.7859,  0.9419,  1.9905]]],\n",
       "       grad_fn=<NativeLayerNormBackward0>)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "out = decoder_layer(tgt, memory)\n",
    "print(out.shape)\n",
    "out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "6a42fb61",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:21:04.252119Z",
     "start_time": "2023-04-27T15:21:04.243119Z"
    }
   },
   "outputs": [],
   "source": [
    "# multi head, masked multi head self attn\n",
    "def self_attn(x):\n",
    "    x = decoder_layer.self_attn(x, x, x)[0]\n",
    "    return decoder_layer.dropout1(x)\n",
    "# multi head, multi head attn\n",
    "def cross_attn(q, k, v=None):\n",
    "    if v is None:\n",
    "        v = k\n",
    "    x = decoder_layer.multihead_attn(q, k, v)[0]\n",
    "    return decoder_layer.dropout2(x)\n",
    "def ffn(x):\n",
    "    # h => 4h (512, 2048)\n",
    "    x = decoder_layer.dropout(F.relu(decoder_layer.linear1(x)))\n",
    "    # 4h => h (2048, 512)\n",
    "    x = decoder_layer.linear2(x)\n",
    "    return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "a83635a5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:21:12.515614Z",
     "start_time": "2023-04-27T15:21:12.493596Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([20, 32, 512])\n",
      "torch.Size([20, 32, 512])\n",
      "torch.Size([20, 32, 512])\n"
     ]
    }
   ],
   "source": [
    "print(self_attn(tgt).shape)\n",
    "print(cross_attn(tgt, memory, memory).shape)\n",
    "print(ffn(tgt).shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "9af12f3a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:21:23.402859Z",
     "start_time": "2023-04-27T15:21:23.394255Z"
    }
   },
   "outputs": [],
   "source": [
    "# https://arxiv.org/pdf/2002.04745v1.pdf\n",
    "def decoder_forward(tgt, memory, norm_first=False):\n",
    "    x = tgt\n",
    "    if norm_first:\n",
    "        x = x + self_attn(decoder_layer.norm1(x))\n",
    "        x = x + cross_attn(decoder_layer.norm2(x), memory)\n",
    "        x = x + ffn(decoder_layer.norm3(x))\n",
    "    else:\n",
    "        x = decoder_layer.norm1(x + self_attn(x))\n",
    "        x = decoder_layer.norm2(x + cross_attn(x, memory))\n",
    "        x = decoder_layer.norm3(x + ffn(x))\n",
    "    return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "099e990f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-04-27T15:23:38.871024Z",
     "start_time": "2023-04-27T15:23:38.850778Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[-1.8008,  0.0955,  0.4715,  ..., -0.8585,  1.3289, -0.8393],\n",
       "         [-0.9372,  0.3635,  0.5085,  ..., -1.6473,  0.3759,  1.4563],\n",
       "         [-0.6191,  0.0879,  0.6518,  ..., -0.2662, -0.5986, -0.1011],\n",
       "         ...,\n",
       "         [-0.7245,  0.2882, -0.6515,  ..., -0.3170,  0.3018,  1.0053],\n",
       "         [-0.7184,  0.9173,  0.2708,  ..., -1.1280,  0.7655,  0.5195],\n",
       "         [-0.1449,  1.3841, -1.6920,  ..., -1.5435,  0.8277,  1.8407]],\n",
       "\n",
       "        [[ 0.0512,  0.6386, -0.0195,  ..., -0.2089,  2.6903,  1.4809],\n",
       "         [ 0.4438, -0.0604, -0.5986,  ...,  0.0636,  1.2456, -0.1515],\n",
       "         [-0.2601, -1.1402, -1.0853,  ...,  0.1306,  1.2988,  1.3415],\n",
       "         ...,\n",
       "         [ 0.7709,  0.1656, -1.2257,  ..., -0.8002, -0.0339,  2.0337],\n",
       "         [-1.1068, -0.9135,  0.7009,  ...,  0.4307,  0.7334,  1.4293],\n",
       "         [-1.7199,  1.5007,  0.3761,  ..., -1.8088,  1.7812,  0.2291]],\n",
       "\n",
       "        [[-0.1397, -0.4083, -0.9826,  ..., -1.3970,  1.2486,  0.2054],\n",
       "         [-1.0634, -0.6352, -0.2336,  ..., -1.5486, -0.3188,  1.2034],\n",
       "         [-1.6039,  0.3520,  0.1545,  ..., -1.6741,  0.4996,  1.4587],\n",
       "         ...,\n",
       "         [-2.1638, -0.6909, -0.1016,  ..., -0.5763,  2.3496, -0.5038],\n",
       "         [-0.1091, -0.6120,  0.7259,  ..., -0.0967,  1.3078,  1.2574],\n",
       "         [-0.8147,  1.6513,  0.1907,  ..., -1.5854,  0.0800, -0.5341]],\n",
       "\n",
       "        ...,\n",
       "\n",
       "        [[-0.1486,  0.3316, -1.2555,  ..., -1.3356,  0.7492,  0.0624],\n",
       "         [-0.4191,  0.0374, -0.7435,  ..., -0.5843,  1.3116,  0.3629],\n",
       "         [ 0.6715, -0.4680, -0.2566,  ..., -1.6594,  1.5688,  1.1539],\n",
       "         ...,\n",
       "         [ 0.0748,  1.6114,  0.2869,  ...,  0.1299,  1.3297, -0.1339],\n",
       "         [-1.1404,  0.7748, -1.0458,  ..., -0.7664,  1.7932,  1.3885],\n",
       "         [-1.5743,  0.6126, -0.4044,  ..., -1.3283,  2.3873,  1.2038]],\n",
       "\n",
       "        [[-0.3198,  1.0928, -0.7945,  ..., -1.5612,  1.3291,  1.6834],\n",
       "         [-1.2999, -0.3100, -1.6255,  ..., -1.5263,  2.0699,  0.7236],\n",
       "         [ 0.1870, -0.7859, -1.5370,  ...,  0.2425,  0.1045,  1.3136],\n",
       "         ...,\n",
       "         [-0.0416,  1.6009, -0.3964,  ..., -1.3005,  1.5739,  0.5326],\n",
       "         [-0.8052, -0.4260, -0.1789,  ..., -0.4825,  0.6915,  0.8723],\n",
       "         [-0.2016,  1.3798, -1.6962,  ...,  0.1432,  1.0728, -0.7677]],\n",
       "\n",
       "        [[-1.7552,  1.0003, -0.3777,  ...,  0.3128,  0.2593,  1.5819],\n",
       "         [-0.5774,  0.0282,  0.1389,  ..., -1.8704,  0.3523, -0.1210],\n",
       "         [-0.4373, -0.9840, -0.1368,  ...,  0.2160,  1.8261,  0.9377],\n",
       "         ...,\n",
       "         [ 0.6790,  1.2266, -1.8964,  ..., -1.6937,  1.2025,  1.0664],\n",
       "         [-0.4589,  1.5109, -0.8836,  ...,  0.5577,  0.9277,  0.3527],\n",
       "         [ 0.3819,  1.5442,  0.3358,  ..., -0.7859,  0.9419,  1.9905]]],\n",
       "       grad_fn=<NativeLayerNormBackward0>)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "decoder_forward(tgt, memory)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "336px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
